/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.view.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.FeriadoOrganizacionDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.dto.UbigeoDto;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.ArchivoManager;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.FeriadoOrganizacionManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.manager.UbigeoManager;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("feriadoOrganizacionMBean")
@Scope("session")
public class FeriadoOrganizacionMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(FeriadoOrganizacionMBean.class);
    @Resource
    private FeriadoOrganizacionManager manager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private ArchivoManager archivoManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<FeriadoOrganizacionDto> lista;
    private FeriadoOrganizacionDto dto;
    private FeriadoOrganizacionDto dtoFiltro;
    private String keyEntidad = "key.entidad.feriado.organizacion";
    private Date date1;
    private String strDates;
    private String strFechaInicio;
    private String strFechaFin;

    public FeriadoOrganizacionMBean() {
        this.dtoFiltro = new FeriadoOrganizacionDto();
    }

    public String iniciar(OrganizacionDto organizacionDto) {
        try {
            this.lista = null;
            this.dto = this.manager.inicializar();
            this.dtoFiltro = new FeriadoOrganizacionDto();
            this.dtoFiltro.setOrganizacionDto(organizacionDto);
            this.dtoFiltro.setAnio(UtilCore.Fecha.obtenerAnioActual());
            this.generarFechaInicioYFin(this.dtoFiltro.getAnio());
            strDates = this.manager.obtenerFeriadosPorOrganizacion(dtoFiltro).toString();
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    private void generarFechaInicioYFin(int anio) {
        this.strFechaInicio = this.manager.generarFechaInicioPorAnio(anio);
        this.strFechaFin = this.manager.generarFechaFinPorAnio(anio);
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        return manager.getUrl();
    }

    public void listenerSelectDate(DateSelectEvent event) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(applicationMBean.getFormatoFecha());
            Date fechaFeriado = sdf.parse(sdf.format(event.getDate()));
            String strFechaFeriado = sdf.format(event.getDate());
            //Verificamos si la {fecha,organizacion} ya existe en la base de datos
            int cantidad = this.manager.obtenerCantidadFeriadoPorFechaOrganizacion(dtoFiltro, strFechaFeriado);
            if (cantidad > 0) {
                //Si ya existe en base de datos la accion es Editar
                sessionMBean.setAccion(applicationMBean.getEditar());
                List<FeriadoOrganizacionDto> lst = this.manager.obtenerFeriadoPorFechaOrganizacion(dtoFiltro, strFechaFeriado);
                if (!lst.isEmpty()) {
                    dto = lst.get(0);
                }
            } else {
                //Si no existe la accion es Nuevo
                sessionMBean.setAccion(applicationMBean.getNuevo());
                dto = this.manager.inicializar();
                dto.setOrganizacionDto(dtoFiltro.getOrganizacionDto());
                dto.setFechaFeriado(fechaFeriado);
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            logger.error(ex);
        }
    }

    public void buscar() {
        try {
            this.generarFechaInicioYFin(this.dtoFiltro.getAnio());
            strDates = this.manager.obtenerFeriadosPorOrganizacion(dtoFiltro).toString();
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public String guardar() {
        try {
            if (manager.guardar(this.dto) != null) {
                strDates = this.manager.obtenerFeriadosPorOrganizacion(dtoFiltro).toString();
            }
        } catch (DAOException ex) {
            logger.error(ex);
        }
        this.generarFechaInicioYFin(this.dtoFiltro.getAnio());
        return null;
    }

    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public String retroceder() {
        return organizacionManager.getUrlLista();
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        FeriadoOrganizacionMBean.logger = logger;
    }

    public FeriadoOrganizacionManager getManager() {
        return manager;
    }

    public void setManager(FeriadoOrganizacionManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public List<UbigeoDto> getListaPaises() {
        UbigeoManager m = (UbigeoManager) WebServletContextListener.getApplicationContext().getBean("ubigeoManager");
        try {
            return m.obtenerPaisesActivos();
        } catch (DAOException ex) {
            logger.error(ex);
            return new ArrayList<UbigeoDto>();
        }
    }

    public List<FeriadoOrganizacionDto> getLista() {
        return lista;
    }

    public void setLista(List<FeriadoOrganizacionDto> lista) {
        this.lista = lista;
    }

    public FeriadoOrganizacionDto getDto() {
        return dto;
    }

    public void setDto(FeriadoOrganizacionDto dto) {
        this.dto = dto;
    }

    public FeriadoOrganizacionDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(FeriadoOrganizacionDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public String getStrDates() {
        return strDates;
    }

    public void setStrDates(String strDates) {
        this.strDates = strDates;
    }

    public String getStrFechaInicio() {
        return strFechaInicio;
    }

    public void setStrFechaInicio(String strFechaInicio) {
        this.strFechaInicio = strFechaInicio;
    }

    public String getStrFechaFin() {
        return strFechaFin;
    }

    public void setStrFechaFin(String strFechaFin) {
        this.strFechaFin = strFechaFin;
    }
}
